package com.assessment.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class FileUpload {
	
	public String fileupload(HttpServletRequest request){
		//得到上传文件的保存目录，将上传的文件存放于WEB-INF目录下，不允许外界直接访问，保证上传文件的安全
		String savePath = request.getSession().getServletContext().getRealPath("/WEB-INF/upload");
		System.out.println(savePath);
		String filepath="";
		File file = new File(savePath);
		//判断上传文件的保存目录是否存在
		if (!file.exists() && !file.isDirectory()) {
			System.out.println(savePath+"目录不存在，需要创建");
			//创建目录
			file.mkdir();
		}
		try {
			//使用Apache文件上传组件处理文件上传步骤：
			//1、创建一个DiskFileItemFactory工厂
			DiskFileItemFactory factory=new DiskFileItemFactory();
			//2、创建一个文件上传解析器
			 ServletFileUpload upload = new ServletFileUpload(factory);
			  //解决上传文件名的中文乱码
			 upload.setHeaderEncoding("UTF-8");
			//3、判断提交上来的数据是否是上传表单的数据
//			 if(!ServletFileUpload.isMultipartContent(request)){
//				 //按照传统方式获取数据
//				 return "";
//			 }
			 //4、使用ServletFileUpload解析器解析上传数据，解析结果返回的是一个List<FileItem>集合，每一个FileItem对应一个Form表单的输入项
			 List<FileItem> list=upload.parseRequest(request);
			 for(FileItem item:list){
				 if(item.isFormField()){
					 String name = item.getFieldName();
					//解决普通输入项的数据的中文乱码问题
					 String value = item.getString("UTF-8");
				 }else{//如果fileitem中封装的是上传文件
					  String filename = item.getName();
					  System.out.println(filename);
					  if(filename==null || filename.trim().equals("")){
						  continue;
					  }
					  //处理获取到的上传文件的文件名的路径部分，只保留文件名部分
					  filename = filename.substring(filename.lastIndexOf("\\")+1);
					  
					  InputStream inputStream=item.getInputStream();
					  filepath=savePath+"\\"+filename;
					  FileOutputStream out=new FileOutputStream(filepath);
					  
					  byte buffer[]=new byte[1024];
					  int len=0;
					  //循环将输入流读入到缓冲区当中，(len=in.read(buffer))>0就表示in里面还有数据
					  while((len=inputStream.read(buffer))>0){
						  //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
						  out.write(buffer, 0, len);
					  }
					  inputStream.close();
					  out.close();
					  item.delete();
//					  message="文件上传成功";
				 }
			 }
		} catch (Exception e) {
			System.out.println("文件上传失败++++++++++++++++");
		}
		return filepath;
	}

}
